
// 创建一个节流函数，用于优化滚动事件
function throttle (func, delay) {
    let lastTime = 0;  // 上一次执行的时间

    return function () {
        const now = new Date().getTime();  // 获取当前时间
        if (now - lastTime >= delay) {
            func.apply(this, arguments);  // 执行传入的函数
            lastTime = now;  // 更新上次执行时间
        }
    };
}


// 创建一个构造函数 DifferentclassificationTableFiexed，用于实现固定行的功能
var DifferentclassificationTableFiexed = function () {
    // 初始化一个空的表格引用
    let classificationTable = null;  // 用于存储表格的 DOM 元素引用

    // 初始化一个数组，用于存储所有固定行的定义
    const fixedRowDefs = []; // 每个固定行的定义包括：行的标识、原始行、固定高度和复制的行

    // 定义一个方法，用于添加一个固定行到 fixedRowDefs 数组
    let addFixedRow = function (propertyName) {
        // 使用指定的属性名查找对应的单元格，并获取该单元格的父元素（即整行）
        
        let _td =  classificationTable.querySelector("td[propertyname='" + propertyName + "']");
	    if( _td == null ){ return; };
	    let row = _td.parentElement;
       

        // 计算当前行的固定高度，若这是第一个固定行，固定高度为 0
        let fixedHeight = fixedRowDefs.length == 0
            ? 0
            : (fixedRowDefs[fixedRowDefs.length - 1].srcRow.offsetHeight + fixedRowDefs[fixedRowDefs.length - 1].fixedHeight);

        // 定义一个固定行的对象，并将其推入 fixedRowDefs 数组中
        let fixedRowDef = {
            rowName: propertyName, // 行的标识符
            srcRow: row,           // 原始行的 DOM 元素
            fixedHeight: fixedHeight, // 固定行的位置
            copiedRow: null        // 复制的固定行，初始为 null
        };
        fixedRowDefs.push(fixedRowDef);  // 将该行信息加入固定行数组
    };

    // 定义一个方法，用于处理窗口的滚动事件，控制固定行的显示与隐藏
    let addScrollEvent = function () {
        // 监听窗口的滚动事件
        window.addEventListener('scroll', throttle(function () {
            // 遍历所有需要固定的行
            for (let i = 0; i < fixedRowDefs.length; i++) {
                let _rowDef = fixedRowDefs[i];  // 获取当前固定行的定义
                const rowRect = _rowDef.srcRow.getBoundingClientRect();  // 获取该行的位置信息

                // 如果当前行已经滚动到固定位置，且还没有复制行
                if (rowRect.top <= _rowDef.fixedHeight && _rowDef.copiedRow == undefined) {
                    // 克隆该行，生成一个新的固定行
                    _rowDef.copiedRow = _rowDef.srcRow.cloneNode(true);
                    _rowDef.copiedRow.id = _rowDef.rowName + "-copy";  // 设置复制行的 ID
                    _rowDef.copiedRow.classList.add('mc-classification-fixed-row');  // 给复制行添加样式
                    _rowDef.copiedRow.style.top = _rowDef.fixedHeight + "px";  // 设置复制行的顶部位置

                    // 设置复制行中每个单元格的宽度与原行一致
                    for (let j = 0; j < _rowDef.srcRow.cells.length; j++) {
                        //_rowDef.copiedRow.cells[j].style.width = _rowDef.srcRow.cells[j].offsetWidth + 'px';
                        jQueryEnterprise(_rowDef.copiedRow.cells[j]).width(jQueryEnterprise(_rowDef.srcRow.cells[j]).width());
                    }

                    // 将复制的行添加到表格的 tbody 中
                    classificationTable.querySelector("tbody").appendChild(_rowDef.copiedRow);

                    // 如果当前行已经滚动回去，且已有复制行，则移除复制行
                } else if (rowRect.top > _rowDef.fixedHeight && _rowDef.copiedRow != undefined) {
                    _rowDef.copiedRow.remove();  // 移除复制行
                    _rowDef.copiedRow = null;  // 清空复制行的引用
                }
            }
        }, 100));
    };

    // 定义一个主方法，用于初始化表格并设置固定行
    this.fixedRow = function () {
        // 获取表格元素
        classificationTable = document.querySelector("table.DifferentclassificationTable");
        if (classificationTable){
            // 添加需要固定的行（根据属性名）
            addFixedRow("materialCategory");  // 添加 materialCategory 行
            addFixedRow("materialGrade");     // 添加 materialGrade 行
            addFixedRow("materialTradeName"); // 添加 materialTradeName 行
            // 添加滚动事件监听器
            addScrollEvent();
        }
    };
};

 